package com.yxx.strategy.uploadStrategyImpl;

import com.yxx.exception.ServiceException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.*;

/**
 * 本地上传策略
 * 依赖注入（DI）：Spring 的 @Service 注解和 @Resource 注解实现了依赖注入，使得不同策略的选择变得简单且解耦。
 * @author yuxiangxun
 * @date 2025/1/27
 * @apiNote
 */
@Service("localUploadStrategyImpl") //将具体的策略实现类注册为 Spring Bean，方便通过名称注入并在上下文类中选择使用。
public class LocalUploadStrategyImpl extends AbstractUploadStrategyImpl{

    /**
     * 本地路径
     */
    @Value("${upload.local.path}")
    private String localPath;

    /**
     * 访问url
     */
    @Value("${upload.local.url}")
    private String localUrl;

    /**
     * 判断文件是否存在
     * @param filePath 文件路径
     * @return
     */
    @Override
    public Boolean exists(String filePath) {
        return new File(localPath+filePath).exists();
    }


    /**
     * 上传
     * @param path        路径
     * @param fileName    文件名
     * @param inputStream 输入流
     * @throws IOException
     */
    @Override
    public void upload(String path, String fileName, InputStream inputStream) throws IOException {
        // 根据 新文件全路径 创建目录
        File directory = new File(localPath+path+fileName);
        // 判断目录是否存在
        if(!directory.exists()){
            if(!directory.mkdirs()){
                throw new ServiceException("创建目录失败");
            }
        }
        // 写入文件
        File file = new File(localPath + path + fileName);
        if(file.createNewFile()){
            try (
                    BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
                    BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file))
            ){
                byte[] bytes = new byte[4096];
                int length;
                while((length = bufferedInputStream.read(bytes)) != -1){
                    bufferedOutputStream.write(bytes,0,length);
                }
            }catch (Exception e){
                throw new ServiceException("文件上传失败");
            }
        }
    }

    /**
     * 获取文件访问url
     * @param filePath 文件路径
     * @return
     */
    @Override
    public String getFileAccessUrl(String filePath) {
        return localPath+filePath;
    }
}
